package com.cloud.netty.codec2;

import com.cloud.netty.codec.StudentPOJO;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;

/*
* 说明
* 1.我们自定义一个handler 需要继续netty 规定好的某个handlerAdapter(规范)
* 2.这时我们自定义一个handler，才能成为一个handler
* */
public class NettyServerHandler extends SimpleChannelInboundHandler<MyDataInfo.MyMessage> {


    /** 读取实际数据（这里我们可以读取各个客户端发送的消息）
     * 1.channelHandlerContext 上下文对象，含有管道pipeline，通道channel，地址
     * 2.Object msg：客户端发送的数据，以对象的形式接收
     * */
    @Override
    public void channelRead0(ChannelHandlerContext ctx, MyDataInfo.MyMessage msg) throws Exception {
        // 根据dataType显示不同的信息
        MyDataInfo.MyMessage.DataType dataType = msg.getDataType();
        if (dataType == MyDataInfo.MyMessage.DataType.StudentType) {
            MyDataInfo.Student student = msg.getStudent();
            System.out.println("student.getId() + student.getName() = " + student.getId() + student.getName());
        } else if (dataType == MyDataInfo.MyMessage.DataType.WorkType) {
            MyDataInfo.Worker worker = msg.getWorker();
            System.out.println("worker.getId() + worker.getName() = " + worker.getId() + worker.getName());
        } else {
            System.out.println("传输的类型不对！");
        }
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        // 数据写入到缓冲区，并刷新
        // 一般讲，我们对发送的数据进行编码
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello,客户端~",CharsetUtil.UTF_8));
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        // 出现异常需要关闭通道
        ctx.close();
    }
}
